/*
 * log.c
 *
 */

#include "log.h"
#include "dlmd.h"

#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>

static struct timeval current_time;

void dlmd_log_init(void)
{
	if (opt_log_to_syslog) {
		// TODO syslog
	} else {
		int fd = open(opt_log_file, O_WRONLY | O_APPEND | O_CREAT, \
									S_IRWXU | S_IRWXG |S_IRWXO);
		if (fd == -1) {
			fprintf(stderr, "ERROR Cannot open log file, exiting\n");
			dlmd_exit(2);
		}
		dup2(fd, stderr);
		close(fd);

		init("initializing DLMD v%s", DLMD_VERSION);
	}
}
static inline void dlmd_log(char *type, const char *template, va_list ap)
{
	gettimeofday(&current_time, NULL);
	char *ct = ctime(&current_time.tv_sec);
	ct[strlen(ct)-1] = '\0';
	fprintf(stderr, "[%s] pid %d %s ", ct, getpid(), type);
	vfprintf(stderr, template, ap);
	fprintf(stderr, "\n");
}
/* init message service */
void init(const char *template, ...)
{
	if (stderr) {
		va_list ap;
		va_start(ap, template);
		dlmd_log("INIT", template, ap);
		va_end(ap);
	}
}
/* exit messages service */
void die(const char *template, ...)
{
	if (stderr) {
		va_list ap;
		va_start(ap, template);
		dlmd_log("EXIT", template, ap);
		va_end(ap);
	}
}
/* critical error mesages service */
void err(const char* template, ...)
{
	if (stderr) {
		va_list ap;
		va_start(ap, template);
		dlmd_log("ERROR", template, ap);
		va_end(ap);
	}
}
/* error messages service */
void oops(const char *template, ...)
{
	if (opt_debug_level >= DLMD_LOG_ERR) {
		va_list ap;
		va_start(ap, template);
		dlmd_log("OOPS", template, ap);
		va_end(ap);
	}
}
/* informational messages service */
void info(const char *template, ...)
{
	if (opt_debug_level >= DLMD_LOG_INFO) {
		va_list ap;
		va_start(ap, template);
		dlmd_log("INFO", template, ap);
		va_end(ap);
	}
}
/* debug messages service */
void debug(const char *template, ...)
{
	if (opt_debug_level >= DLMD_LOG_DEBUG) {
		va_list ap;
		va_start(ap, template);
		dlmd_log("DEBUG", template, ap);
		va_end(ap);
	}
}
/* debug2 messages service */
void debug2(const char *template, ...)
{
	if (opt_debug_level >= DLMD_LOG_DEBUG2) {
		va_list ap;
		va_start(ap, template);
		dlmd_log("DEBUG2", template, ap);
		va_end(ap);
	}
}
